package com.rpcservice.rpc.remoting.transport.netty.client;

import com.rpcservice.rpc.remoting.dto.RpcResponse;

import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 服务器未处理的请求。
 */
public class UnprocessedRequests {
    //建议限制 map 容器大小，避免未处理请求过多 OOM
    //这里使用 ConcurrentHashMap 来存储未处理的请求，
    //其中 key 是请求 ID，value 是 CompletableFuture，用于异步处理请求。
    //当客户端收到服务器的响应时，会根据响应的请求 ID 从 map 中获取对应的 CompletableFuture，
    //并将响应数据设置到 CompletableFuture 中，从而实现异步处理响应。
    //这样，客户端就可以通过 CompletableFuture 来获取服务器的响应数据，
    //而不需要阻塞等待服务器的响应。
    private static final Map<String, CompletableFuture<RpcResponse<Object>>> UNPROCESSED_RESPONSES = new ConcurrentHashMap<>();

    public void put(String requestId, CompletableFuture<RpcResponse<Object>> future) {
        UNPROCESSED_RESPONSES.put(requestId, future);
    }

    public void complete(RpcResponse<Object> rpcResponse) {
        CompletableFuture<RpcResponse<Object>> future = UNPROCESSED_RESPONSES.remove(rpcResponse.getRequestId());
        if (Objects.nonNull(future)) {
            future.complete(rpcResponse);
        } else {
            throw new IllegalStateException();
        }
    }
}
